home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / developm / language / macberon.sit / MacOberon 2.4(0) / SampleApp.Mod (.txt) < prev    next >
Encoding:
Oberon Text  |  1991-10-17  |  8.3 KB  |  148 lines

  1. Syntax10.Scn.Fnt
  2. MODULE SampleApp;    (* Sample Macintosh Application Running under MacOberon    Michael Franz, 30.08.90/10.10.91 *)
  3. IMPORT
  4.     TY:= MacTypes, DL:= MacDialogs, DS:= MacDesk, EM:= MacEvents, MN:= MacMenus,
  5.     QD:= MacQuickDraw, TE:= MacTextEdit, WM:= MacWindows, Macintosh, SYSTEM;
  6. CONST    (* Resource ID Definitions. *)
  7.     (* About Sample Alert *)    rAboutAlert= 128;
  8.     (* Sample MenuBar *)    rSampleMBar= 128;
  9.     (* Apple Menu *)    mApple= 128;    iAbout= 1;
  10.     (* File Menu *)    mFile= 129;    iQuit= 1;
  11.     (* Edit Menu *)    mEdit= 130;    iUndo= 1; iCut= 3; iCopy= 4; iPaste= 5; iClear= 6;    (* Standard Ordering. *)
  12.     (* Sample Menu *)    mSamp= 131;    iNew= 1;
  13.     inForeground: BOOLEAN;    (* Flag set if Application Currently in the Foreground [MultiFinder]. *)
  14.     winCounter: SHORTINT;    (* Application Window Number. *)
  15.     terminate: BOOLEAN;    (* Return to Oberon on next Loop Iteration when TRUE. *)
  16.     theResFile: INTEGER;    (* Reference Number of Sample's Ressource File. *)
  17. (* Switching Between the "Look And Feel" of Oberon and that of Sample. *)
  18.     PROCEDURE - OpenResFile(fileName: TY.Str255): INTEGER    0A9H, 097H;
  19.     PROCEDURE - CloseResFile(refNum: INTEGER)    0A9H, 09AH;
  20.     PROCEDURE SetupSampleLooks;
  21.         VAR resName: TY.Str255; mb: TY.Handle;
  22.     BEGIN    TY.SetStr255(resName, "SampleApp.r"); theResFile:= OpenResFile(resName);
  23.         mb := MN.GetNewMBar(rSampleMBar); MN.SetMenuBar(mb);
  24.         MN.AddResMenu(MN.GetMHandle(mApple), 44525652H); (* DRVR *)
  25.         MN.AddResMenu(MN.GetMHandle(mSamp), 464F4E54H); (* FONT *)
  26.         MN.DrawMenuBar; QD.SetCursor(QD.globals.arrow); Macintosh.HideOberonWindow
  27.     END SetupSampleLooks;
  28.     PROCEDURE RestoreOberonLooks;
  29.     BEGIN    CloseResFile(theResFile); Macintosh.ShowOberonMenus; Macintosh.ShowOberonArrow; Macintosh.ShowOberonWindow
  30.     END RestoreOberonLooks;
  31. (* The Sample Application. *)
  32.     PROCEDURE IsOberonWindow(window: WM.WindowPtr): BOOLEAN;    (* Check if Window belongs to Oberon Shell. *)
  33.     BEGIN    RETURN window.refCon=4D534F46H (*in case you are wondering, MSOF stands for Michael S. O. Franz*)
  34.     END IsOberonWindow;
  35.     PROCEDURE IsDAWindow(window: WM.WindowPtr): BOOLEAN;    (* Check if a Window belongs to a Desk Accessory. *)
  36.     BEGIN    RETURN (window#NIL)&(window.windowKind < 0)
  37.     END IsDAWindow;
  38.     PROCEDURE IsAppWindow(window: WM.WindowPtr): BOOLEAN;    (* Check if a Window belongs to the Sample Application. *)
  39.     BEGIN    RETURN (window#NIL)&~IsOberonWindow(window)&((window.windowKind >= WM.userKind) OR (window.windowKind = WM.dialogKind))
  40.     END IsAppWindow;
  41.     PROCEDURE NewWindow;    (* Create a New Application TextEdit Window #nn and Enable AutoScroll. *)
  42.         VAR winTitle: TY.Str255; wbounds, tbounds: TY.Rect; window: WM.WindowPtr; thePort: QD.GrafPtr; text: TE.TEHandle;
  43.     BEGIN    wbounds.top := QD.globals.screenBits.bounds.top + 40 + 10 * (winCounter MOD 10);
  44.         wbounds.left := QD.globals.screenBits.bounds.left + 20 + 10 * (winCounter MOD 10);
  45.         wbounds.bottom := wbounds.top + 200; wbounds.right := wbounds.left + 300;
  46.         INC(winCounter); winTitle[0] := 3X; winTitle[1] := 23X;
  47.         winTitle[2] := CHR((winCounter DIV 10) MOD 10 + 30H); winTitle[3] := CHR(winCounter MOD 10 + 30H);
  48.         window := WM.NewWindow(NIL, wbounds, winTitle, TRUE, 4, SYSTEM.VAL(WM.WindowPtr, -1), TRUE, 0);
  49.         QD.GetPort(thePort); QD.SetPort(window);    tbounds.left := 5; tbounds.top := 5;
  50.         tbounds.right := wbounds.right - wbounds.left - 10; tbounds.bottom := wbounds.bottom - wbounds.top - 10;
  51.         text := TE.TENew(tbounds, tbounds); text.p.txFont := 3; text.p.txSize := 12; TE.TEAutoView(TRUE, text);
  52.         window.refCon := SYSTEM.VAL(LONGINT, text); QD.SetPort(thePort)
  53.     END NewWindow; 
  54.     PROCEDURE DrawWindow(window: WM.WindowPtr);    (* Draw the Contents of the Application Window. *)
  55.     BEGIN    QD.SetPort(window); TE.TEUpdate(window.portRect, SYSTEM.VAL(TE.TEHandle, window.refCon))
  56.     END DrawWindow; 
  57.     PROCEDURE CloseWindow(window: WM.WindowPtr);    (* Close a Window. *)
  58.     BEGIN
  59.         IF    IsDAWindow(window)    THEN    DS.CloseDeskAcc(window.windowKind)    ELSE    WM.CloseWindow(window)    END
  60.     END CloseWindow;
  61.     PROCEDURE Terminate;    (* Close all Windows and Return to Oberon. *)
  62.         VAR aWindow: WM.WindowPtr;
  63.     BEGIN    terminate := TRUE; aWindow := WM.FrontWindow();    (* Currently Visible Front Window *)
  64.         WHILE    aWindow # NIL    DO    CloseWindow(aWindow); aWindow := WM.FrontWindow()    END
  65.     END Terminate;
  66.     PROCEDURE AdjustMenus;    (* Enable and Disable Menus based on the Current Processing State. *)
  67.         VAR window: WM.WindowPtr; menu: MN.MenuHandle;
  68.     BEGIN    window := WM.FrontWindow(); menu := MN.GetMHandle(mEdit);
  69.         IF    IsDAWindow(window)    THEN    (* A Desk Accessory might Need the Edit Menu. *)
  70.             MN.EnableItem(menu, iUndo); MN.EnableItem(menu, iCut); MN.EnableItem(menu, iCopy);
  71.             MN.EnableItem(menu, iPaste); MN.EnableItem(menu, iClear)
  72.         ELSE    (* But We Do Not. *)
  73.             MN.DisableItem(menu, iUndo); MN.DisableItem(menu, iCut); MN.DisableItem(menu, iCopy);
  74.             MN.DisableItem(menu, iClear); MN.DisableItem(menu, iPaste)
  75.         END
  76.     END AdjustMenus;
  77.     PROCEDURE MenuCommand(menuResult: LONGINT);    (* Item has been Chosen (by MenuSelect or MenuKey). *)
  78.         CONST noMenu= 0;
  79.         VAR menuID, menuItem: INTEGER; daName: TY.Str255; daRefNum: INTEGER; itemHit: INTEGER; handledByDA: BOOLEAN;
  80.     BEGIN    menuID := SHORT(menuResult DIV 10000H); menuItem := SHORT(menuResult MOD 10000H);
  81.         CASE    menuID    OF
  82.         |    noMenu:    (* Menu Exited during MenuSelect. *)
  83.         |    mApple:
  84.                     IF    menuItem = iAbout    THEN    itemHit := DL.Alert(rAboutAlert, NIL)
  85.                     ELSE    MN.GetItem(MN.GetMHandle(mApple), menuItem, daName); daRefNum := DS.OpenDeskAcc(daName)
  86.                     END
  87.         |    mFile:    IF    menuItem = iQuit    THEN    Terminate    END
  88.         |    mEdit:    IF    IsDAWindow(WM.FrontWindow())    THEN    handledByDA := DS.SystemEdit(menuItem-1)    END
  89.         |    mSamp:    IF    menuItem = iNew    THEN    NewWindow    END
  90.         END;
  91.         MN.HiliteMenu(noMenu)    (* Unhighlight what MenuSelect (or MenuKey) Highlighted. *)
  92.     END MenuCommand;
  93.     PROCEDURE Update(window: WM.WindowPtr);    (* This is Called when an Update Event is Received. *)
  94.     BEGIN
  95.         IF    IsAppWindow(window)    THEN    WM.BeginUpdate(window);
  96.             IF    ~QD.EmptyRgn(window.visRgn)    THEN
  97.                 TE.TEUpdate(window.portRect, SYSTEM.VAL(TE.TEHandle, window.refCon))
  98.             END;
  99.             WM.EndUpdate(window)
  100.         ELSIF    IsOberonWindow(window)    THEN    Macintosh.UpdateOberonWindow
  101.         END
  102.     END Update;
  103.     PROCEDURE Activate(window: WM.WindowPtr; becomingActive: BOOLEAN);    (* Window is Activated or Deactivated. *)
  104.     BEGIN
  105.         IF    IsAppWindow(window)    THEN
  106.             IF    becomingActive    THEN    QD.SetPort(window); TE.TEActivate(SYSTEM.VAL(TE.TEHandle, window.refCon))
  107.             ELSE    TE.TEDeactivate(SYSTEM.VAL(TE.TEHandle, window.refCon))    END
  108.         END
  109.     END Activate;
  110.     PROCEDURE Loop*();
  111.         VAR gotEvent: BOOLEAN; event: EM.EventRecord; window: WM.WindowPtr; key: TY.UnpackedChar;
  112.     BEGIN    SetupSampleLooks; terminate := FALSE;
  113.         REPEAT    gotEvent := EM.WaitNextEvent(EM.everyEvent, event, 0, NIL);
  114.             CASE    event.what    OF
  115.             |    EM.mouseDown:
  116.                         CASE WM.FindWindow(event.where, window) OF
  117.                         |    WM.inMenuBar:    AdjustMenus; MenuCommand(MN.MenuSelect(event.where))
  118.                         |    WM.inSysWindow:    DS.SystemClick(event, window)
  119.                         |    WM.inContent:
  120.                                     IF    window # WM.FrontWindow()    THEN    WM.SelectWindow(window)
  121.                                     ELSE    QD.GlobalToLocal(event.where);
  122.                                         TE.TEClick(event.where, FALSE, SYSTEM.VAL(TE.TEHandle, window.refCon))
  123.                                     END
  124.                         |    WM.inDrag:    WM.DragWindow(window, event.where, QD.globals.screenBits.bounds)
  125.                         |    WM.inGoAway:    CloseWindow(window)
  126.                         |    WM.inDesk, WM.inGrow, WM.inZoomIn, WM.inZoomOut:
  127.                         END;
  128.             |    EM.keyDown:    (* message: bits 0..7=character code / modifiers: bit8: 0=cmdKeyUp 1=cmdKeyDown *)
  129.                         key := SHORT(event.message MOD 100H);
  130.                         IF    8 IN SYSTEM.VAL(SET, LONG(event.modifiers))    THEN    AdjustMenus; MenuCommand(MN.MenuKey(key))
  131.                         ELSE    window := WM.FrontWindow(); TE.TEKey(key, SYSTEM.VAL(TE.TEHandle, window.refCon))    END
  132.             |    EM.autoKey:    
  133.                         key := SHORT(event.message MOD 100H);    (* bits 0..7=character code *)
  134.                         window := WM.FrontWindow(); TE.TEKey(key, SYSTEM.VAL(TE.TEHandle, window.refCon))
  135.             |    EM.updateEvt:    Update(SYSTEM.VAL(WM.WindowPtr, event.message))
  136.             |    EM.activateEvt:    Activate(SYSTEM.VAL(WM.WindowPtr, event.message), ODD(event.modifiers))    (* bit0:  0=deactivate 1=activate *)
  137.             |    EM.app4Evt:    (* OS Event under MultiFinder; bit31..bit24=00000001: SuspendResumeEvt *)
  138.                         IF    SYSTEM.LSH(event.message, -24) (*MOD 100H*) = 1    THEN    (* bit0:  0=deactivate 1=activate *)
  139.                             inForeground := ODD(event.message); Activate(WM.FrontWindow(), inForeground);
  140.                         END
  141.             ELSE    (* Ignore Other Event Types *)
  142.             END    (* Dispatch on Event Type *)
  143.         UNTIL    terminate;
  144.         RestoreOberonLooks
  145.     END Loop;
  146. BEGIN    inForeground := TRUE
  147. END SampleApp.
  148.